[小ネタ] プライベートIPアドレスを指定して EC2 インスタンスを起動する方法
はじめに
EC2 インスタンスを VPC 内に起動する際、プライベート IP アドレスを指定して起動することができます。
通常は自動的に採番されるのですが、IP アドレスが固定である前提で使われていた EC2 インスタンスを急遽作り直す必要がある場合(例えば深夜の障害発生時!)など、止むに止まれぬ事情 があるときに便利ですね。
方法
上に紹介したリンク先にも書いてありますが、 EC2 インスタンスを起動する際に指定できます。
マネジメントコンソールから起動する場合
「インスタンスの作成」から AMI とインスタンスタイプを選択した後の、「手順 3: インスタンスの詳細の設定」の画面で設定します。
最初は指定する項目がでていなくて軽く面食らうのですが、
インスタンスを起動するサブネットを指定すると、
「ネットワークインターフェイス」の設定欄が現れます。ここの「プライマリ IP」の欄に指定する IP アドレスを記載して下さい。
AWS CLI の場合
--private-ip-address
というオプションで指定します。他の必要なオプションといっしょに、--subnet-id
で指定したサブネットの範囲内に収まる IP アドレスを指定して下さい。
aws ec2 run-instances \ --image-id "<AMI ID>" \ --instance-type "<インスタンスタイプ>" \ --key-name "<キーペア名>" \ --subnet-id "<サブネット ID>" \ --private-ip-address "<プライベート IP アドレス>"
注意
使用できない IP アドレスがあります
サブネット内には、AWS が予約しているなどの理由で使用できない IP アドレスもあります。下記ドキュメントの IPv4 用の VPC とサブネットのサイズ設定 の項を参照して下さい。
簡単に抜き出すと、下記は避けてくださいということになります。
- ネットワークアドレス / ブロードキャストアドレス(当然!)
- 先頭から 3つ(デフォルトゲートウェイや内部 DNS など、AWS が予約)
また、サブネット内で既に使われているプライベート IP アドレスも使えません。重複不可です。
「なにを当たり前のことを。。。」
と思われるかもしれませんが、これには 現在 stop 状態のインスタンス も含まれます。同時に起動しないからといって、同じ IP アドレスを使い回すことは出来ないということです。
また、例えそうと意識していなくても、 ELB や VPC エンドポイントなどでも VPC 内の IP アドレスは使われています。これらとも当然重複できませんのでご注意下さい。
全てのプライベート IP アドレスを手動管理しようとは思わないでください
「これができるんなら、オンプレと同じように IP アドレス一覧を作って Excel で管理しよう、末尾 10番台は Web、末尾 20番台は…」
・・・と考えたくなる方もいるかもしれないのですが、 AWS のみならずクラウドインフラでは推奨されない考え方なのでご注意を! 運用の手間が増えるだけでなく、AWS でいえば CloudFormation や AutoScaling といったクラウドインフラの利点を使えなくする考え方だからです。
また仮にそれらを使っていなかったとしても、前述したように ELB など AWS マネージドインフラが使用する IP アドレスと重複してしまう危険性は常にあります。これらが使えなかったら、「何のために AWS を使うのか」って思えてきますよね。
このあたりはよく「ペットと家畜」の比喩(サーバ 1台 1台に名前をつけ、懇切丁寧に維持管理する「ペット(pet)」モデル vs ある機能を提供する集団として管理し、1台 1台は取り替えのきく部品として扱う「家畜(cattle)」モデル)のなかで語られることがある文脈ですので、興味を持たれた方は調べてみるのも面白いのではないでしょうか。
参考
- #cmdevio2018 基礎から応用までじっくり学ぶ「AWSでのネットワークの作り方」で登壇しました。 | DevelopersIO
- Amazon VPC IPアドレス設計レシピ | DevelopersIO
まとめ
EC2 インスタンスを起動する際に、プライベート IP アドレスを指定する方法についてまとめました。先日久しぶりにそれをやろうと思って、マネジメントコンソールの前で「あれ、どこで指定するんだっけ?」って考え込んだのが発端です。
出来ることを知っておくと緊急回避的に役に立つことがある反面、上述したように副作用もありますのでお気をつけください。ご利用は計画的に。